using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._NetworkDiagramTools._Configuration
{
    /// <summary>
    /// <para>Add Expand Container Rule</para>
    /// <para>Adds a diagram rule that automatically expands container contents during diagram building  based on an existing template. This rule expands all of the container contents in the diagrams.</para>
    /// <para>添加一个关系图规则，该规则在基于现有模板构建关系图期间自动扩展容器内容。此规则将展开关系图中的所有容器内容。</para>
    /// </summary>    
    [DisplayName("Add Expand Container Rule")]
    public class AddExpandContainerRule : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public AddExpandContainerRule()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_utility_network">
        /// <para>Input Network</para>
        /// <para>The utility network or trace network containing the diagram template to modify.</para>
        /// <para>包含要修改的逻辑示意图模板的公共设施网络或追踪网络。</para>
        /// </param>
        /// <param name="_template_name">
        /// <para>Input Diagram Template</para>
        /// <para>The name of the diagram template to modify.</para>
        /// <para>要修改的逻辑示意图模板的名称。</para>
        /// </param>
        /// <param name="_is_active">
        /// <para>Active</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the rule will be active when generating and updating diagrams based on the specified template.
        ///   <bulletList>
        ///     <bullet_item>Checked—The added rule will become active during the generation and update of any diagrams based on the input template. This is the default.  </bullet_item><para/>
        ///     <bullet_item>Unchecked—The added rule will not become active during the generation or update of any diagrams based on the input template.  </bullet_item><para/>
        ///   </bulletList>
        ///   </para>
        /// </xdoc></para>
        /// <para><xdoc>
        /// <para>指定在基于指定模板生成和更新关系图时，规则是否处于活动状态。
        ///   <bulletList>
        ///     <bullet_item>选中 - 在基于输入模板生成和更新任何逻辑示意图期间，添加的规则将变为活动状态。这是默认设置。 </bullet_item><para/>
        ///     <bullet_item>未选中 - 在基于输入模板生成或更新任何逻辑示意图期间，添加的规则将不会变为活动状态。</bullet_item><para/>
        ///   </bulletList>
        ///   </para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_containers_visibility">
        /// <para>Keep containers visible</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the containers stay visible after they are expanded.
        ///   <bulletList>
        ///     <bullet_item>Checked—The containers will stay visible after they are expanded. This is the default.  </bullet_item><para/>
        ///     <bullet_item>Unchecked—The containers will be hidden after they are expanded.  </bullet_item><para/>
        ///   </bulletList>
        ///   </para>
        /// </xdoc></para>
        /// <para><xdoc>
        /// <para>指定容器在展开后是否保持可见。
        ///   <bulletList>
        ///     <bullet_item>选中 - 容器在展开后将保持可见。这是默认设置。 </bullet_item><para/>
        ///     <bullet_item>未选中 - 容器展开后将被隐藏。</bullet_item><para/>
        ///   </bulletList>
        ///   </para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_container_type">
        /// <para>Container Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the geometry type of the container source class or object table to be processed.</para>
        ///   <bulletList>
        ///     <bullet_item>Junctions only—Only junction container source classes or object tables (polygon container source classes, point container source classes, or container junction object tables) will be processed.</bullet_item><para/>
        ///     <bullet_item>Edges only—Only edge container source classes or object tables (linear container source classes or container edge object tables) will be processed.</bullet_item><para/>
        ///     <bullet_item>Both junctions and edges—All container source classes and object tables regardless of their type (both junction and edge types), will be processed. This is the default.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定要处理的容器源类或对象表的几何类型。</para>
        ///   <bulletList>
        ///     <bullet_item>仅交汇点 - 仅处理交汇点容器源类或对象表（面容器源类、点容器源类或容器交汇点对象表）。</bullet_item><para/>
        ///     <bullet_item>仅边 - 仅处理边容器源类或对象表（线性容器源类或容器边对象表）。</bullet_item><para/>
        ///     <bullet_item>交汇点和边 - 将处理所有容器源类和对象表，无论其类型如何（交汇点和边类型）。这是默认设置。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        /// <param name="_inverse_source_selection">
        /// <para>Rule Process</para>
        /// <para><xdoc>
        ///   <para>Specifies how the specified container source classes and object tables will be processed.</para>
        ///   <bulletList>
        ///     <bullet_item>Exclude source classes—Containers based on the specified source classes and object tables will not be expanded, while other containers will be expanded. This is the default.</bullet_item><para/>
        ///     <bullet_item>Include source classes—Containers based on the specified source classes and object tables will be expanded.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定如何处理指定的容器源类和对象表。</para>
        ///   <bulletList>
        ///     <bullet_item>排除源类 - 基于指定源类和对象表的容器将不被展开，而其他容器将被展开。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>包括源类 - 将展开基于指定源类和对象表的容器。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        public AddExpandContainerRule(object _in_utility_network, object _template_name, _is_active_value _is_active, _containers_visibility_value _containers_visibility, _container_type_value _container_type, _inverse_source_selection_value _inverse_source_selection)
        {
            this._in_utility_network = _in_utility_network;
            this._template_name = _template_name;
            this._is_active = _is_active;
            this._containers_visibility = _containers_visibility;
            this._container_type = _container_type;
            this._inverse_source_selection = _inverse_source_selection;
        }
        public override string ToolboxName => "Network Diagram Tools";

        public override string ToolName => "Add Expand Container Rule";

        public override string CallName => "nd.AddExpandContainerRule";

        public override List<string> AcceptEnvironments => [];

        public override object[] ParameterInfo => [_in_utility_network, _template_name, _is_active.GetGPValue(), _containers_visibility.GetGPValue(), _container_type.GetGPValue(), _inverse_source_selection.GetGPValue(), _container_sources, _description, _out_utility_network, _out_template_name];

        /// <summary>
        /// <para>Input Network</para>
        /// <para>The utility network or trace network containing the diagram template to modify.</para>
        /// <para>包含要修改的逻辑示意图模板的公共设施网络或追踪网络。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Network")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_utility_network { get; set; }


        /// <summary>
        /// <para>Input Diagram Template</para>
        /// <para>The name of the diagram template to modify.</para>
        /// <para>要修改的逻辑示意图模板的名称。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Diagram Template")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _template_name { get; set; }


        /// <summary>
        /// <para>Active</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the rule will be active when generating and updating diagrams based on the specified template.
        ///   <bulletList>
        ///     <bullet_item>Checked—The added rule will become active during the generation and update of any diagrams based on the input template. This is the default.  </bullet_item><para/>
        ///     <bullet_item>Unchecked—The added rule will not become active during the generation or update of any diagrams based on the input template.  </bullet_item><para/>
        ///   </bulletList>
        ///   </para>
        /// </xdoc></para>
        /// <para><xdoc>
        /// <para>指定在基于指定模板生成和更新关系图时，规则是否处于活动状态。
        ///   <bulletList>
        ///     <bullet_item>选中 - 在基于输入模板生成和更新任何逻辑示意图期间，添加的规则将变为活动状态。这是默认设置。 </bullet_item><para/>
        ///     <bullet_item>未选中 - 在基于输入模板生成或更新任何逻辑示意图期间，添加的规则将不会变为活动状态。</bullet_item><para/>
        ///   </bulletList>
        ///   </para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Active")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _is_active_value _is_active { get; set; }

        public enum _is_active_value
        {
            /// <summary>
            /// <para>ACTIVE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("ACTIVE")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>INACTIVE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("INACTIVE")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Keep containers visible</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the containers stay visible after they are expanded.
        ///   <bulletList>
        ///     <bullet_item>Checked—The containers will stay visible after they are expanded. This is the default.  </bullet_item><para/>
        ///     <bullet_item>Unchecked—The containers will be hidden after they are expanded.  </bullet_item><para/>
        ///   </bulletList>
        ///   </para>
        /// </xdoc></para>
        /// <para><xdoc>
        /// <para>指定容器在展开后是否保持可见。
        ///   <bulletList>
        ///     <bullet_item>选中 - 容器在展开后将保持可见。这是默认设置。 </bullet_item><para/>
        ///     <bullet_item>未选中 - 容器展开后将被隐藏。</bullet_item><para/>
        ///   </bulletList>
        ///   </para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Keep containers visible")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _containers_visibility_value _containers_visibility { get; set; }

        public enum _containers_visibility_value
        {
            /// <summary>
            /// <para>KEEP_VISIBLE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("KEEP_VISIBLE")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>HIDE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("HIDE")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Container Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the geometry type of the container source class or object table to be processed.</para>
        ///   <bulletList>
        ///     <bullet_item>Junctions only—Only junction container source classes or object tables (polygon container source classes, point container source classes, or container junction object tables) will be processed.</bullet_item><para/>
        ///     <bullet_item>Edges only—Only edge container source classes or object tables (linear container source classes or container edge object tables) will be processed.</bullet_item><para/>
        ///     <bullet_item>Both junctions and edges—All container source classes and object tables regardless of their type (both junction and edge types), will be processed. This is the default.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定要处理的容器源类或对象表的几何类型。</para>
        ///   <bulletList>
        ///     <bullet_item>仅交汇点 - 仅处理交汇点容器源类或对象表（面容器源类、点容器源类或容器交汇点对象表）。</bullet_item><para/>
        ///     <bullet_item>仅边 - 仅处理边容器源类或对象表（线性容器源类或容器边对象表）。</bullet_item><para/>
        ///     <bullet_item>交汇点和边 - 将处理所有容器源类和对象表，无论其类型如何（交汇点和边类型）。这是默认设置。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Container Type")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _container_type_value _container_type { get; set; }

        public enum _container_type_value
        {
            /// <summary>
            /// <para>Junctions only</para>
            /// <para>Junctions only—Only junction container source classes or object tables (polygon container source classes, point container source classes, or container junction object tables) will be processed.</para>
            /// <para>仅交汇点 - 仅处理交汇点容器源类或对象表（面容器源类、点容器源类或容器交汇点对象表）。</para>
            /// </summary>
            [Description("Junctions only")]
            [GPEnumValue("JUNCTIONS")]
            _JUNCTIONS,

            /// <summary>
            /// <para>Edges only</para>
            /// <para>Edges only—Only edge container source classes or object tables (linear container source classes or container edge object tables) will be processed.</para>
            /// <para>仅边 - 仅处理边容器源类或对象表（线性容器源类或容器边对象表）。</para>
            /// </summary>
            [Description("Edges only")]
            [GPEnumValue("EDGES")]
            _EDGES,

            /// <summary>
            /// <para>Both junctions and edges</para>
            /// <para>Both junctions and edges—All container source classes and object tables regardless of their type (both junction and edge types), will be processed. This is the default.</para>
            /// <para>交汇点和边 - 将处理所有容器源类和对象表，无论其类型如何（交汇点和边类型）。这是默认设置。</para>
            /// </summary>
            [Description("Both junctions and edges")]
            [GPEnumValue("BOTH")]
            _BOTH,

        }

        /// <summary>
        /// <para>Rule Process</para>
        /// <para><xdoc>
        ///   <para>Specifies how the specified container source classes and object tables will be processed.</para>
        ///   <bulletList>
        ///     <bullet_item>Exclude source classes—Containers based on the specified source classes and object tables will not be expanded, while other containers will be expanded. This is the default.</bullet_item><para/>
        ///     <bullet_item>Include source classes—Containers based on the specified source classes and object tables will be expanded.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定如何处理指定的容器源类和对象表。</para>
        ///   <bulletList>
        ///     <bullet_item>排除源类 - 基于指定源类和对象表的容器将不被展开，而其他容器将被展开。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>包括源类 - 将展开基于指定源类和对象表的容器。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Rule Process")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _inverse_source_selection_value _inverse_source_selection { get; set; }

        public enum _inverse_source_selection_value
        {
            /// <summary>
            /// <para>Exclude source classes</para>
            /// <para>Exclude source classes—Containers based on the specified source classes and object tables will not be expanded, while other containers will be expanded. This is the default.</para>
            /// <para>排除源类 - 基于指定源类和对象表的容器将不被展开，而其他容器将被展开。这是默认设置。</para>
            /// </summary>
            [Description("Exclude source classes")]
            [GPEnumValue("EXCLUDE_SOURCE_CLASSES")]
            _EXCLUDE_SOURCE_CLASSES,

            /// <summary>
            /// <para>Include source classes</para>
            /// <para>Include source classes—Containers based on the specified source classes and object tables will be expanded.</para>
            /// <para>包括源类 - 将展开基于指定源类和对象表的容器。</para>
            /// </summary>
            [Description("Include source classes")]
            [GPEnumValue("INCLUDE_SOURCE_CLASSES")]
            _INCLUDE_SOURCE_CLASSES,

        }

        /// <summary>
        /// <para>Container Sources</para>
        /// <para><xdoc>
        ///   <para>The container source class (or classes) and object table (or tables) that will be excluded or included depending on the rule process.</para>
        ///   <para>When Rule Process is set to Exclude source classes (inverse_source_selection = "EXCLUDE_SOURCE_CLASSES" in Python), no particular container source class or object table can be specified. In this case, all containers in the generated diagrams regardless of their source class or object table will be expanded. When Rule Process is set to Include source classes (inverse_source_selection = "INCLUDE_SOURCE_CLASSES" in Python), the particular container source class (or classes) and object table (or tables) to be expanded must be specified.</para>
        ///   <para>When running the Exclude source classes option (inverse_source_selection = "EXCLUDE_SOURCE_CLASSES" in Python), the containers belonging to the specified source classes or object tables will not be expanded in the generated diagrams; however, container features and container objects that don't belong to those source classes and tables will be expanded. Conversely, when running the Include source classes option (inverse_source_selection = "INCLUDE_SOURCE_CLASSES" in Python), the containers belonging to the specified source classes and object tables will be expanded in the generated diagrams; however, container features and container objects that don't belong to those source classes and object tables will not be expanded.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>根据规则进程，将排除或包含的容器源类（或多个）和对象表（或多个表）。</para>
        ///   <para>当“规则进程”设置为“排除源类”（Python 中为 inverse_source_selection = “EXCLUDE_SOURCE_CLASSES”） 时，无法指定特定的容器源类或对象表。在这种情况下，将展开生成的关系图中的所有容器，无论其源类或对象表如何。当“规则进程”设置为“包括源类”（在 Python 中inverse_source_selection = “INCLUDE_SOURCE_CLASSES”）时，必须指定要展开的特定容器源类（或多个类）和对象表。</para>
        ///   <para>运行“排除源类”选项（Python 中为 inverse_source_selection = “EXCLUDE_SOURCE_CLASSES”） 时，属于指定源类或对象表的容器不会在生成的逻辑示意图中展开;但是，将展开不属于这些源类和表的容器功能和容器对象。相反，当运行“包括源类”选项（Python 中的 inverse_source_selection = “INCLUDE_SOURCE_CLASSES”）时，属于指定源类和对象表的容器将在生成的图表中展开;但是，不属于这些源类和对象表的容器功能和容器对象将不会展开。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Container Sources")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _container_sources { get; set; } = null;


        /// <summary>
        /// <para>Description</para>
        /// <para>The description of the rule.</para>
        /// <para>规则的说明。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Description")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _description { get; set; } = null;


        /// <summary>
        /// <para>Output Network</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Network")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _out_utility_network { get; set; }


        /// <summary>
        /// <para>Output Diagram Template</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Diagram Template")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _out_template_name { get; set; }


        public AddExpandContainerRule SetEnv()
        {
            base.SetEnv();
            return this;
        }

    }

}